package com.foreknow.elm.util;


import java.awt.*;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;

/**
 * Created by foreknow on 2022/4/12.
 * Java中的反射机制(动态机制): 它是Java中非常重要的特性
 * 反射的特点：
 * 1. 在程序运行的时候可以判断一个对象所属的类
 * 2. 也可以运行程序的时候获取到类的对象
 * 3. 在程序运行的时候可以获取到类的变量以及方法
 *
 * 反射的几种常用的写法
 * 1. Class.forName("java.lang.Integer")
 * 2. ReflectionDemo.class
 * 3. getClass()
 */
public class ReflectionDemo {
    public void getNameTest(){
        String name ="tom123";
        Class clazz=name.getClass();
        System.out.println("String的类名为:"+clazz.getName());
        Button button = new Button();
        Class buttonClass=button.getClass();
        System.out.println("button类的名称为:"+buttonClass.getName());
        Class classSuperclass= buttonClass.getSuperclass();
        System.out.println("Button父类的名称为:"+classSuperclass.getName());
    }

    public String testMethod(String str, HashMap hashMap){
        String returnstr = "这个返回最终返回数据";
        System.out.println("获取map中的数据"+hashMap.get("name"));
        return returnstr;

    }

    /**
     * 通过Java中的反射来调用testMethod(String str, HashMap hashMap)方法
     */
    public void getMethodTest() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        //获取到类对象
        Class cls = Class.forName("com.foreknow.elm.util.ReflectionDemo");
        //2.获取到当前对象ReflectionDemo中的方法名getMethodTest
        //getMethod(String name,Class<?>...parameterTypes) name表示要获取的方法名称 parameterTypes表示方法的参数
        // 定义方法的参数列表Class[]
        Class[] types = new Class[2];
        types[0] = Class.forName("java.lang.String");
        types[1] = Class.forName("java.util.HashMap");
        Method method =cls.getMethod("testMethod",types);
        //3. 调用当前对象ReflectionDemo对象中的getMethodTest方法 1.当前对象 2.实参
        Object[] args = new Object[2];
        args[0] = "abc";
        HashMap hashmap = new HashMap();
        hashmap.put("name","fender");
        args[1] = hashmap;
        String str = (String) method.invoke(new ReflectionDemo(),args);
        System.out.println(str);
    }
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException {
        ReflectionDemo reflectionDemo = new ReflectionDemo();
        reflectionDemo.getMethodTest();
    }
}
